feat(eval): add measurement manifests for online scoring - #722
Conversation
PR Summary by QodoAdd per-agent measurement manifests for online scoring (trace_fitness em-001)
AI Description
Diagram
High-Level Assessment
Files changed (8)
|
|
🤖 Review · Commit: |
Code Review by Qodo
1.
|
|
🤖 Review · Commit: |
|
🤖 Finished Review · ✅ Success · Started 11:55 AM UTC · Completed 12:08 PM UTC Commit: |
ReviewFindingsHigh
Low
Next steps:
Previous runReviewFindingsHigh
Low
Next steps:
Previous run (2)ReviewFindingsHigh
Low
Next steps:
Previous run (3)ReviewFindingsHigh
Low
Labels: PR adds new eval/measurements subsystem (YAML manifests, linter, tests) — feature addition, not purely documentation Next steps:
Previous run (4)ReviewFindingsHigh
Low
Next steps:
Previous run (5)ReviewFindingsLow
Previous run (6)ReviewFindingsLow
Labels: PR adds YAML policy files and documentation for eval measurement manifests Previous run (7)ReviewFindingsLow
|
c1dbd68 to
74b8959
Compare
|
🤖 Review · Commit: |
|
🤖 Finished Review · ✅ Success · Started 1:34 PM UTC · Completed 1:48 PM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
MEDIUM: No CI/pre-commit validation for eval/measurements/*.yaml — bad scorer/agent values silently no-op forever
(Referencing .pre-commit-config.yaml line 49, which isn't part of this PR's diff, so noting it here in the review body instead of inline.)
Confirmed on head 93d3db9f: the repo has a pre-commit hook lint-agent-docs (./hack/lint-agent-docs) scoped via files: ^(harness/|docs/|hack/lint-agent-docs) that validates every harness/*.yaml has a valid doc: field, and a separate eval/lint-cases.sh that validates eval/<agent>/cases and eval.yaml judges — but neither covers the new eval/measurements/*.yaml files added in this PR, and no .github/workflows/*.yml step does either. Only the generic check-yaml pre-commit hook (syntax-only) applies.
On the consumer side, in the companion PR fullsend-ai/fullsend#6036, internal/evalmeasure/registry.go's ScoreTrace has:
switch m.Scorer {
case ScorerFitness: ...
default: // Unknown scorers are skipped (forward-compatible)
}i.e. a typo'd scorer: value (e.g. trace-fitness with a hyphen) or a misspelled agent: value that never matches a trace's agent name would pass this repo's CI cleanly, merge, and then silently produce zero measurements for that agent in production with no error/log/CI failure.
The six current manifests all correctly use the literal trace_fitness matching const ScorerFitness = "trace_fitness" in fitness.go, so nothing is broken today, but there's no guardrail against this on the next manifest edit or new-agent addition.
Suggestion: Add a small lint script (sibling to hack/lint-agent-docs, or extend eval/lint-cases.sh) that validates eval/measurements/*.yaml: agent: matches an existing agents/<name>.md, measurements[].id is unique per file, and .scorer/.version are present/well-formed (and, once the fullsend-side registry is stable, checked against a known-scorer allow-list). Wire it into .pre-commit-config.yaml (files: ^eval/measurements/) so a typo fails CI instead of silently no-op'ing at runtime.
93d3db9 to
228c7b5
Compare
|
🤖 Review · Commit: |
|
🤖 Review · ❌ Terminated · Started 11:51 AM UTC · Ended 12:04 PM UTC Commit: |
|
Code review by qodo was updated up to the latest commit 228c7b5 |
|
🤖 Finished Review · ✅ Success · Started 11:51 AM UTC · Completed 12:04 PM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
Automated review sweep — 3 findings (0 duplicates skipped after checking existing inline comments/reviews on this PR).
228c7b5 to
b1de714
Compare
|
@waynesun09 on the 10 Aug review-body finding (no CI for Fixed in b1de714. Added It fails CI on: unknown |
|
🤖 Finished Review · ✅ Success · Started 7:33 PM UTC · Completed 7:48 PM UTC Commit: |
|
🤖 Finished Review · ✅ Success · Started 5:06 AM UTC · Completed 5:21 AM UTC Commit: |
Introduce per-agent measurement manifest YAML files that select which eval measurement scorers run after managed agent jobs. Every agent except scribe gets trace_fitness (EM-001) at initial ship. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Lowercase EM-001 to em-001 in README to match manifest YAML files. Add --- document start markers to all measurement manifests for consistency with harness/*.yaml convention. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Replace ambiguous "every listed agent" phrasing with an explicit list of the six agents that enable trace_fitness at initial ship. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Spell out agents@v0 defaults vs local overrides, engine-vs-policy split with fullsend#6036, and when a change needs fullsend vs agents. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Match eval/measurements/README.md link style for ADR 0087 so the measurement manifest section uses consistent markdown hyperlinks. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Keep the measurement id casing aligned with manifest id fields. Point readers at fullsend#6036 for ADR 0087 until that PR lands on main. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Reject unknown scorers, missing fields, duplicate ids, and agent names that do not match agents/<name>.md so a typo fails CI instead of silently producing zero scores. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Rewrite the pre-commit linter in python3 so it runs on macOS bash 3.2, fails closed on unsupported YAML, and documents em-001 as an agents-repo style rule. Describe the SHA-pinned v0 GetRef fetch instead of a floating raw URL, drop eval/ --- markers, and mention eval/ in README and LOCAL.md. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Fail closed on unknown top-level keys after the measurements list, accept optional name: matching fullsend MeasurementSpec, drop the false thresholds claim, and document GitLab + fetch-allowlist limits. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Match YAML comment rules so code#x / trace_fitness#typo fail closed, reject quoted version and duplicate top-level keys that yaml.v3 rejects, and align the GitLab GetRef docs with the public unauthenticated fetch. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Reject nested block maps under measurement fields and track per-item duplicate keys; note empty top-level agent: so a later agent: is a duplicate. Correct README GH_TOKEN wording for the managed Action. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com>
Close the remaining LoadRegistry fail-open where name: {…}/[…] and
unquoted null/bool literals linted green while yaml.v3 hard-fails.
Signed-off-by: Adam Scerra <ascerra@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve '#' inside quoted scalars so residual-hash rejection runs instead of silently truncating; drop redundant version regex in main. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com>
555f259 to
2df9633
Compare
|
🤖 Finished Review · ✅ Success · Started 2:42 PM UTC · Completed 3:00 PM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
Reviewed the full change at head 2df9633. All prior findings (2 HIGH + 4 MEDIUM/LOW from earlier review rounds) are fixed as of 2a54535: README no longer documents an unpinned raw-URL fetch, lint-measurements.sh is bash-3.2-compatible with fail-closed parsing, casing/YAML-marker/error-message consistency issues resolved. The one disputed finding (review.yaml's em-001 work-item check) is resolved by ascerra's rebuttal — fullsend#5622 added a PR-env fallback to work-item resolution (merged, in v0.33.0+), demonstrated working on a live production run; my original concern was based on stale code.
Protected-path change to .pre-commit-config.yaml (adds one scoped lint-measurements hook) reviewed and approved by a human maintainer.
|
🤖 Finished Retro · ✅ Success · Started 4:16 PM UTC · Completed 4:29 PM UTC Commit: |
Retro: PR #722 -- feat(eval): add measurement manifests for online scoringWorkflow: Human-authored PR by ascerra adding default measurement manifests ( Review cycles: The review agent ran 13 times (8 producing findings); a human reviewer (waynesun09) conducted 4 review sweeps. Review agent behavior: Approved 3 times (Aug 10--13) with only LOW findings (documentation formatting, YAML markers, architectural nits). Switched to CHANGES_REQUESTED on Aug 17 solely due to a Human reviewer findings the review agent missed:
What the review agent did well: Protected-path detection was correct and persistent. Missing-authorization finding (no linked issue for 800+ line PR) was appropriate. LOW documentation consistency findings were accurate. Supporting evidence for existing issues:
Proposals filed: 2 Proposals filed
|
Summary
Add default measurement manifests for stock fullsend agents under
eval/measurements/. These are the online-scoring policy that ships with the agents (“here iscode, and here is what we measure on wildcoderuns”).Companion engine PR: fullsend-ai/fullsend#6036 (ADR 0087,
fullsend eval-measure, EM-001trace_fitness).Ownership (please read)
eval/measurements/<agent>.yamlFULLSEND_DIR${FULLSEND_DIR}/eval/measurements/${AGENT}.yamlif present, else fetchagents@v0from this path. Stock-agent users do not copy these files into every repo.run-telemetry.jsonlproduced by fullsend.assert:→ fullsend; new id / enable / disable / thresholds for a stock agent on an existing scorer → this repo; org-specific policy → consumer override.Changes
eval/measurements/{code,fix,prioritize,retro,review,triage}.yaml— each enablestrace_fitness(em-001) @ version 1eval/measurements/README.md— ownership, resolution, when to PR whereeval/README.md— short section + links to fullsend#6036 / ADR 0087Test plan
agent+measurements[].{id,scorer,version})v0(or the pin fullsend uses) includes these paths so wild runs stop skipping measureNotes for reviewers
eval/<agent>/are unchanged and separate.v0), measure steps skip fail-open — that is expected.